package com.wuyu.util;

import com.alibaba.fastjson.JSON;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.cglib.beans.BeanCopier;

import java.util.ArrayList;
import java.util.List;

/**
 * 类功能描述：类处理工具
 * @author bingtangli
 * @date 2024/02/04
 */
@SuppressWarnings({"rawtypes", "unchecked"})
public class BeanUtil {

    private BeanUtil() {
    }

    /**
     * json格式的数据转换成对象
     *
     * @param json json格式的字符串
     * @param clz  对象类型
     * @param <T>  类型
     * @return 对象
     */
    public static <T> T toBean(String json, Class<T> clz) {
        if (StringUtils.isBlank(json) || clz == null) {
            return null;
        }
        return JSON.parseObject(json, clz);
    }

    /**
     * 对象转换成json
     *
     * @param obj 对象
     * @return json字符串
     */
    public static String toJson(Object obj) {
        if (obj == null) {
            return null;
        }
        return JSON.toJSONString(obj);
    }

    /**
     * 将Json字符串转换成Java对象列表
     *
     * @param json 准备转换的Json字符串
     * @param clz  准备转换的类
     * @return 转换之后的Java对象列表
     */
    public static <T> List<T> toList(String json, Class<T> clz) {
        if (StringUtils.isBlank(json) || clz == null) {
            return null;
        }
        return JSON.parseArray(json, clz);
    }

    /**
     * 对象属性复制
     *
     * @param source    源对象
     * @param targetClz 目标对象类型
     * @return 目标对象
     */
    public static <T> T copy(Object source, Class<T> targetClz) {

        if (source == null || targetClz == null) {
            return null;
        }

        Object target = newInstance(targetClz);
        BeanCopier copier = BeanCopier.create(source.getClass(), targetClz, false);
        copier.copy(source, target, null);

        return (T) target;
    }

    /**
     * 批量对象属性复制
     *
     * @param list      pojo对象列表
     * @param targetClz 对象类型
     * @param <T>       类型
     * @return 目标对象列表
     */
    public static <T> List<T> copyList(List list, Class<T> targetClz) {

        if (CollectionUtils.isEmpty(list) || targetClz == null) {
            return null;
        }

        List<T> result = new ArrayList(list.size());

        for (Object pojo : list) {
            result.add(copy(pojo, targetClz));
        }

        return result;
    }

    /**
     * 创建新对象
     *
     * @param clz 对象类型
     * @return 对象
     */
    private static Object newInstance(Class clz) {
        Object obj;
        try {
            obj = clz.newInstance();
        } catch (Exception e) {
            return null;
        }
        return obj;
    }

}
